package service

import (
	"bloggo/structs"
	"context"
	"errors"
	"fmt"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
)

//SaveTbPageStruct 保存 页面
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveTbPageStruct(ctx context.Context, tbpagestruct *structs.TbPageStruct) error {

	// tbpagestruct对象指针不能为空
	if tbpagestruct == nil {
		return errors.New("tbpagestruct对象指针不能为空")
	}
	//匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveTbPageStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始

		_, errSaveTbPageStruct := zorm.Insert(ctx, tbpagestruct)

		if errSaveTbPageStruct != nil {
			return nil, errSaveTbPageStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveTbPageStruct != nil {
		errSaveTbPageStruct := fmt.Errorf("service.SaveTbPageStruct错误:%w", errSaveTbPageStruct)
		logger.Error(errSaveTbPageStruct)
		return errSaveTbPageStruct
	}

	return nil
}

//UpdateTbPageStruct 更新页面
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateTbPageStruct(ctx context.Context, tbpagestruct *structs.TbPageStruct) error {

	// tbpagestruct对象指针或主键Id不能为空
	if tbpagestruct == nil || (tbpagestruct.Id) < 1 {
		return errors.New("tbpagestruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTbPageStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTbPageStruct := zorm.Update(ctx, tbpagestruct)

		if errUpdateTbPageStruct != nil {
			return nil, errUpdateTbPageStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTbPageStruct != nil {
		errUpdateTbPageStruct := fmt.Errorf("service.UpdateTbPageStruct错误:%w", errUpdateTbPageStruct)
		logger.Error(errUpdateTbPageStruct)
		return errUpdateTbPageStruct
	}

	return nil
}

//UpdateNotZeroTbPageStruct 更新页面
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroTbPageStruct(ctx context.Context, tbpagestruct *structs.TbPageStruct) error {

	// tbpagestruct对象指针或主键Id不能为空
	if tbpagestruct == nil || (tbpagestruct.Id) < 1 {
		return errors.New("tbpagestruct对象指针或主键Id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateTbPageStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_, errUpdateTbPageStruct := zorm.UpdateNotZeroValue(ctx, tbpagestruct)

		if errUpdateTbPageStruct != nil {
			return nil, errUpdateTbPageStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateTbPageStruct != nil {
		errUpdateTbPageStruct := fmt.Errorf("service.UpdateNotZeroTbPageStruct错误:%w", errUpdateTbPageStruct)
		logger.Error(errUpdateTbPageStruct)
		return errUpdateTbPageStruct
	}

	return nil
}

//DeleteTbPageStructById 根据Id删除页面
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteTbPageStructById(ctx context.Context, id string) error {

	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

	//匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteTbPageStruct := zorm.Transaction(ctx, func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(structs.TbPageStructTableName).Append(" WHERE id=?", id)
		_, errDeleteTbPageStruct := zorm.UpdateFinder(ctx, finder)

		if errDeleteTbPageStruct != nil {
			return nil, errDeleteTbPageStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errDeleteTbPageStruct != nil {
		errDeleteTbPageStruct := fmt.Errorf("service.DeleteTbPageStruct错误:%w", errDeleteTbPageStruct)
		logger.Error(errDeleteTbPageStruct)
		return errDeleteTbPageStruct
	}

	return nil
}

//FindTbPageStructById 根据Id查询页面信息
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTbPageStructById(ctx context.Context, id string) (*structs.TbPageStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(structs.TbPageStructTableName).Append(" WHERE id=?", id)
	tbpagestruct := structs.TbPageStruct{}
	has, errFindTbPageStructById := zorm.QueryRow(ctx, finder, &tbpagestruct)

	//记录错误
	if errFindTbPageStructById != nil {
		errFindTbPageStructById := fmt.Errorf("service.FindTbPageStructById错误:%w", errFindTbPageStructById)
		logger.Error(errFindTbPageStructById)
		return nil, errFindTbPageStructById
	}

	if !has {
		return nil, nil
	}

	return &tbpagestruct, nil

}

//FindTbPageStructList 根据Finder查询页面列表
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindTbPageStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]structs.TbPageStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	tbpagestructList := make([]structs.TbPageStruct, 0)
	errFindTbPageStructList := zorm.Query(ctx, finder, &tbpagestructList, page)

	//记录错误
	if errFindTbPageStructList != nil {
		errFindTbPageStructList := fmt.Errorf("service.FindTbPageStructList错误:%w", errFindTbPageStructList)
		logger.Error(errFindTbPageStructList)
		return nil, errFindTbPageStructList
	}

	return tbpagestructList, nil
}
